import api from '@/api'
import config from "./config.js"
/**
 * UNIAPP登录类操作
 */
class login {
	constructor() {

	}
	/**
	 * @method
	 * 进行服务器登录，以获得登录会话
	 * 受限于微信的限制，本函数需要在 <button open-type="getUserInfo" bindgetuserinfo="bindGetUserInfo"></button> 的回调函数中调用
	 * 需要先使用 <button> 弹窗，让用户接受授权，然后再安全调用 uni.getUserInfo 获取用户信息
	 *
	 * @param {Object}   option           登录配置
	 * @param {Function} [option.success] 可选。登录成功后的回调函数，参数 userInfo 微信用户信息
	 * @param {Function} [option.fail]    可选。登录失败后的回调函数，参数 error 错误信息
	 */
	async login(option) {
		const loginRes = await this.getLoginCode();
		const infoRes = await this.getUserInfo(loginRes);
		// 构造请求头，包含 code、encryptedData 和 iv
		const header = {
			[config.WX_HEADER_CODE]: infoRes.code,
			[config.WX_HEADER_ENCRYPTED_DATA]: infoRes.encryptedData,
			[config.WX_HEADER_IV]: infoRes.iv
		}
		return await this.dataRequest(header);
	}
	/**
	 * 获取登录Code
	 */
	async getLoginCode() {
		return await new Promise((resolve, reject) => {
			uni.login({
				provider: 'weixin',
				success: (loginRes) => {
					resolve(loginRes);
				},
				fail: (err) => {
					reject(err);
				}
			});
		})
	}
	async getUserInfo(loginRes) {
		return await new Promise((resolve, reject) => {
			uni.getUserInfo({
				provider: 'weixin',
				success: function(infoRes) {
					resolve({
						code: loginRes.code,
						encryptedData: infoRes.encryptedData,
						iv: infoRes.iv,
						userInfo: infoRes.userInfo
					});
				}
			});
		})
	}
	/**
	 * 数据请求向服务器请求数据
	 * @param {Object} loginResult
	 */
	async dataRequest(header) {
		// 调用微信登录API接口
		return api.user.login(header).then(response => {
			console.log("返回数据", response);
			return response;
			
		});
	}
	/**
	 * @method
	 * 只通过 uni.login 的 code 进行登录
	 * 已经登录过的用户，只需要用 code 换取 openid，从数据库中查询出来即可
	 * 无需每次都使用 uni.getUserInfo 去获取用户信息
	 * 后端 Wafer PHP SDK 需 2.2.x 及以上版本
	 * 
	 * @param {Object}   option           登录配置
	 * @param {string}   option.loginUrl  登录使用的 URL，服务器应该在这个 URL 上处理登录请求，建议配合服务端 SDK 使用
	 * @param {string}   [option.method]  可选。请求使用的 HTTP 方法，默认为 GET
	 * @param {Function} [option.success] 可选。登录成功后的回调函数，参数 userInfo 微信用户信息
	 * @param {Function} [option.fail]    可选。登录失败后的回调函数，参数 error 错误信息
	 */
	async loginWithCode() {
		const loginRes = await this.getLoginCode();
		const header = {
			[config.WX_HEADER_CODE]: loginRes.code
		}
		return await this.dataRequest(header);
	}
}

module.exports = login;
